package com.muchfish.algorithm.array;

/**
 * <a href="https://leetcode.cn/problems/palindrome-number/description/">题目：9. 回文数</a>
 * <br>
 * 题目描述：
 * 给你一个整数 x ，如果 x 是一个回文整数，返回 true ；否则，返回 false 。<br>
 * 回文数：是指正序（从左向右）和倒序（从右向左）读都是一样的整数。<br>
 * 解题思路：
 *
 * <br>
 * 1.方法一：反转一半数字<br>
 * <img src="https://assets.leetcode-cn.com/solution-static/9/9_fig1.png"><br>
 * 1.1 想办法从最后一位开始取值，然后反转。<br>
 *             // x % 10：取余，获取最后一位<br>
 *             // revertedNumber * 10：前一位（低位）再向左移动一位<br>
 *             // revertedNumber * 10 + x % 10：拼接，得到反转后的数字<br>
*  1.2 找出循环临界条件：x > revertedNumber<br>
 * 1.3 奇数和偶数相等的判断条件不同   x == revertedNumber || x == revertedNumber / 10<br>
 * 1.4 排除特殊值 负数和末尾为0的数<br>
 *
 */
public class Array7 {
    public static void main(String[] args) {
        System.out.println(isPalindrome(121));
    }

    private static boolean isPalindrome(int x) {
        // 特殊情况：
        // 如上所述，当 x < 0 时，x 不是回文数。
        // 同样地，如果数字的最后一位是 0，为了使该数字为回文，
        // 则其第一位数字也应该是 0
        // 只有 0 满足这一属性
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int revertedNumber = 0;
        //x > revertedNumber：反转后的数字大于或等于 x，退出循环（此时数字已经处理过半了）
        while (x > revertedNumber) {
            // x % 10：取余，获取最后一位
            // revertedNumber * 10：前一位（低位）再向左移动一位
            // revertedNumber * 10 + x % 10：拼接，得到反转后的数字
            revertedNumber = revertedNumber * 10 + x % 10;
            // x / 10：取整，去除最后一位，因为已经处理过了
            x /= 10;
        }
        // 当数字长度为奇数时，我们可以通过 revertedNumber/10 去除处于中位的数字。
        // 例如，当输入为 12321 时，在 while 循环的末尾我们可以得到 x = 12，revertedNumber = 123，
        // 由于处于中位的数字不影响回文（它总是与自己相等），所以我们可以简单地将其去除。
        return x == revertedNumber || x == revertedNumber / 10;

    }
}
